package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.ParametrosDAOLocal;
import pe.gob.osce.sirenas.dao.convert.ParametrosConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.ParametrosDTO;
import pe.gob.osce.sirenas.model.jpa.Domicilio;
import pe.gob.osce.sirenas.model.jpa.Parametros;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;



@Stateless
public class ParametrosDAOImpl implements ParametrosDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	@Override 
	public List<ParametrosDTO>  listarParametros()
			throws Exception {

		List<ParametrosDTO> listParametrosDTO=null;
		List<Parametros> listaParametrosJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			
			jpql.append("SELECT par FROM Parametros par");
		
			Query	query= em.createQuery( jpql.toString() );
			List<Parametros>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaParametrosJPA=new ArrayList<Parametros>();
				for (Parametros obj: listaObjeto) {					
					listaParametrosJPA.add(obj);
				}
				listParametrosDTO=ParametrosConvert.createListaParametrosDTO(listaParametrosJPA);
			}
			
		} catch (NoResultException nre) {
			listParametrosDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listParametrosDTO;
	}

	@Override 
	public List<ParametrosDTO>  listarParametrosPorPadre(Long idParametro)
			throws Exception {

		List<ParametrosDTO> listParametrosDTO=null;
		List<Parametros> listaParametrosJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();			
			
			jpql.append("SELECT par FROM Parametros par WHERE par.idParametroPadre = :idParametro");
		
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idParametro", idParametro);
			List<Parametros>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaParametrosJPA=new ArrayList<Parametros>();
				for (Parametros obj: listaObjeto) {					
					listaParametrosJPA.add(obj);
				}
				listParametrosDTO=ParametrosConvert.createListaParametrosDTO(listaParametrosJPA);
			}	

		} catch (NoResultException nre) {
			listParametrosDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listParametrosDTO;
	}

	@Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public Parametros actualizaCorrelativo(Parametros parametro)throws Exception {
	    try{
            StringBuilder          jpql= new StringBuilder();
            
            jpql.append(" UPDATE Parametros pr ");
            jpql.append(" SET pr.descValor2 = :correlativo ");
            jpql.append(" WHERE pr.idParametro = :idParametro ");
            
            Query        query= em.createQuery( jpql.toString() );
            
            query.setParameter("correlativo", parametro.getDescValor2());
            query.setParameter("idParametro", parametro.getIdParametro());                        
            query.executeUpdate();
	    
		} catch (NoResultException nre) {
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
	    return parametro;
    }
}
